package thread;
/**
 * void join()
 * 该方法是用来协调线程之间的同步运行的。
 * 
 * 多线程的运行方式:
 * 异步运行:并发运行本身就是异步运行，各干各的。
 * 同步运行:使多个线程运行时存在先后顺序进行。
 * 
 * 
 * @author 范传奇
 *
 */
public class JoinDemo {
	static boolean isFinish = false;//标识图片是否下载完毕
	
	public static void main(String[] args) {
//		boolean isFinish = false;
		/*
		 * java中有一个语法要求:当一个方法的局部内部类中使用了这个方法的其他局部
		 * 变量时，该变量必须声明为final的。
		 * 以当前案例为例:
		 * main方法的局部内部类download中使用main方法的其他局部变量isFinish,
		 * 那么isFinish就必须声明为final的。
		 * 在JDK8之后，final可以不写，但是该特性依然存在，因此不可以在局部内部类
		 * 中对该变量赋值。
		 */
		Thread download = new Thread() {
			public void run() {
				System.out.println("开始下载图片...");
				for(int i=1;i<=100;i++) {
					System.out.println("down:"+i+"%");
					try {
						Thread.sleep(50);
					} catch (InterruptedException e) {
					}
				}
				System.out.println("图片下载完毕!");
				isFinish = true;//下载完毕!
			}
		};
		
		Thread show = new Thread() {
			public void run() {
				try {
					System.out.println("show:开始显示文字...");
					Thread.sleep(2000);
					System.out.println("show:文字显示完毕!");
					
					System.out.println("show:开始显示图片...");
					
					System.out.println("show:等待down...");
					download.join();//show线程会进入阻塞状态，直到download结束为止
					System.out.println("show:等待down完毕!");
					
					if(!isFinish) {
						throw new RuntimeException("图片加载失败!");
					}
					System.out.println("show:图片显示完毕!");
				} catch (Exception e) {
					e.printStackTrace();
				}			
			}
		};
		download.start();
		show.start();
	}
}













